package com.coszero.utils.utils

import android.content.Context
import android.content.SharedPreferences
import android.util.Log

/**
 * @author xmqian
 * @date 2018/12/29 10:14
 * @desc SharedPreferences存储App的配置数据
 * @version 1
 */
object SharedPreUtils {
    private val FILE_NAME: String = "config"
    private var sharedPreferences: SharedPreferences? = null

    /**
     * 存储字符串
     *
     * @param context 上下文
     * @param key 键名称
     * @param value 值内容
     */
    @JvmStatic
    fun saveStringData(context: Context, key: String?, value: String?) {
        checkNull(context)

        sharedPreferences!!.edit().putString(key, value).commit()
    }

    fun saveBoolean(context: Context, key: String?, value: Boolean) {
        checkNull(context)
        sharedPreferences!!.edit().putBoolean(key, value).commit()
    }

    fun getBooleanData(context: Context, key: String?, defValue: Boolean): Boolean {
        checkNull(context)
        return sharedPreferences!!.getBoolean(key, defValue)
    }

    @JvmStatic
    fun saveInteger(context: Context, key: String?, value: Int) {
        checkNull(context)
        sharedPreferences!!.edit().putInt(key, value).commit()
    }

    @JvmStatic
    fun getIntegerData(context: Context, key: String?, defValue: Int): Int {
        checkNull(context)
        return sharedPreferences!!.getInt(key, defValue)
    }

    /**
     * 取得存储的字符串
     *
     * @param context 上下文
     * @param key 键名称
     * @param defValue 默认值
     * @return 返回存储的值，没有则返回默认值
     */
    @JvmStatic
    fun getStringData(context: Context, key: String?, defValue: String?): String? {
        checkNull(context)
        return sharedPreferences!!.getString(key, defValue)
    }

    /**
     * 在logcat里面打印所有文件中的内容
     *
     * @param context 上下文
     */
    fun showAllStringData(context: Context) {
        checkNull(context)
        val all: Map<String, String?> = sharedPreferences!!.getAll() as Map<String, String?>
        for (entry: Map.Entry<String, String?> in all.entries) {
            println(entry.key + ":::" + entry.value)
        }
    }

    /**
     * 删除文件中指定的键值数据
     *
     * @param context 上下文
     * @param key 你要删除的键名称
     */
    fun deleteStringData(context: Context, key: String?) {
        checkNull(context)
        sharedPreferences!!.edit().remove(key).commit()
    }

    /**
     * 快速保存数据,先保存在内存，再写入磁盘
     *
     * @param context
     * @param key
     * @param object
     */
    fun put(context: Context, key: String?, `object`: Any) {
        checkNull(context)
        val editor: SharedPreferences.Editor = sharedPreferences!!.edit()

        //我们需要拿到保存数据的具体类型，然后根据类型调用不同的保存方法
        if (`object` is String) {
            editor.putString(key, `object`)
        } else if (`object` is Int) {
            editor.putInt(key, `object`)
        } else if (`object` is Boolean) {
            editor.putBoolean(key, `object`)
        } else if (`object` is Float) {
            editor.putFloat(key, `object`)
        } else if (`object` is Long) {
            editor.putLong(key, `object`)
        } else {
            editor.putString(key, `object`.toString())
        }
        editor.apply()
    }

    /**
     * 获取数据
     *
     * @param context
     * @param key
     * @param defaultObject
     * @return
     */
    fun get(context: Context, key: String?, defaultObject: Any?): Any? {
        checkNull(context)
        //根据默认值得到保存的数据的具体类型，然后调用相对于的方法获取值
        if (defaultObject is String) {
            return sharedPreferences!!.getString(key, defaultObject)
        } else if (defaultObject is Int) {
            return sharedPreferences!!.getInt(key, defaultObject)
        } else if (defaultObject is Boolean) {
            return sharedPreferences!!.getBoolean(key, defaultObject)
        } else if (defaultObject is Float) {
            return sharedPreferences!!.getFloat(key, defaultObject)
        } else if (defaultObject is Long) {
            return sharedPreferences!!.getLong(key, defaultObject)
        }
        return null
    }

    /**
     * 清除所有数据
     *
     * @param context
     */
    @JvmStatic
    fun clear(context: Context) {
        checkNull(context)
        val editor: SharedPreferences.Editor = sharedPreferences!!.edit()
        editor.clear()
        editor.apply()
    }

    /**
     * 查询某个key是否已经存在
     *
     * @param context
     * @param key
     * @return
     */
    fun contains(context: Context, key: String?): Boolean {
        checkNull(context)
        return sharedPreferences!!.contains(key)
    }

    /**
     * 返回所有的键值对
     *
     * @param context
     * @return
     */
    fun getAll(context: Context): Map<String, *> {
        checkNull(context)
        return sharedPreferences!!.getAll()
    }

    private fun checkNull(context: Context) {
        if (sharedPreferences == null) {
            sharedPreferences = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE)
            Log.w("SharedPreUtils", "### sharedPreferences is null")
        }
    }
}
